#include <iostream>
#include <istream>
#include <ranges>

using std::cin,std::cout;
static constexpr const auto range = std::ranges::views::iota;

const int MAX_N = 39+5;
int n;
int map[MAX_N][MAX_N];
int x,y,now{1};

int main(){
    std::iostream::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);

    std::cin>>n;
    x=1,y=n/2+1;

    map[x][y]=now++;

    /*
    1. 若 $(K-1)$ 在第一行但不在最后一列，则将 $K$ 填在最后一行， $(K-1)$ 所在列的右一列；
    2. 若 $(K-1)$ 在最后一列但不在第一行，则将 $K$ 填在第一列， $(K-1)$ 所在行的上一行；
    3. 若 $(K-1)$ 在第一行最后一列，则将 $K$ 填在 $(K-1)$ 的正下方；
    4. 若 $(K-1)$ 既不在第一行，也不在最后一列，如果 $(K-1)$ 的右上方还未填数，则将 $K$ 填在 $(K-1)$ 的右上方，否则将 $K$ 填在 $(K-1)$ 的正下方。
    */
    while(now<=n*n){
        if(x==1 && y!=n){
            x=n,y++;
        }else if(y==n && x!=1){
            y=1,x--;
        }else if(x==1 && y==n){
            x++;
        }else if(x!=1 && y!=n){
            if(map[x-1][y+1]==0){
                x--;
                y++;
            }else{
                x++;
            }
        }
        map[x][y]=now++;
    }

    for(int i:range(1,n+1)){
        for(int j:range(1,n+1)){
            std::cout<<map[i][j]<<" ";
        }
        std::cout<<"\n";
    }
}